From 2f249882f1ed006caf545d224638791fbce3d422 Mon Sep 17 00:00:00 2001 From: "iap10@labyrinth.cl.cam.ac.uk" Date: Wed, 14 Jul 2004 18:52:20 +0000 Subject: [PATCH] bitkeeper revision 1.1088.1.1 (40f580e4lUYRavz4xXHwSuq0WmwdyA) Clip vbd size to size of underlying device. A temporary fix until we replace the grow/shrink interface. --- .../arch/xen/drivers/blkif/backend/vbd.c | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/linux-2.4.26-xen-sparse/arch/xen/drivers/blkif/backend/vbd.c b/linux-2.4.26-xen-sparse/arch/xen/drivers/blkif/backend/vbd.c index 6704fbb541..134e94ef26 100644 --- a/linux-2.4.26-xen-sparse/arch/xen/drivers/blkif/backend/vbd.c +++ b/linux-2.4.26-xen-sparse/arch/xen/drivers/blkif/backend/vbd.c @@ -79,6 +79,8 @@ void vbd_grow(blkif_be_vbd_grow_t *grow) vbd_t *vbd = NULL; rb_node_t *rb; blkif_vdev_t vdevice = grow->vdevice; + struct gendisk *gd; + struct hd_struct *hd; blkif = blkif_find_by_handle(grow->domid, grow->blkif_handle); if ( unlikely(blkif == NULL) ) @@ -123,6 +125,35 @@ void vbd_grow(blkif_be_vbd_grow_t *grow) x->extent.sector_length = grow->extent.sector_length; x->next = (blkif_extent_le_t *)NULL; + gd = get_gendisk(x->extent.device); + + if (!gd || !gd->part) + { + grow->status = BLKIF_BE_STATUS_VBD_NOT_FOUND; + DPRINTK("vbd_grow: device %08x doesn't exist.\n", x->extent.device); + goto out; + } + + hd = &gd->part[MINOR(x->extent.device)]; + + if (!hd) + { + grow->status = BLKIF_BE_STATUS_VBD_NOT_FOUND; + DPRINTK("vbd_grow: HD device %08x doesn't exist.\n", x->extent.device); + goto out; + } + + printk("vbd_grow: requested_len %llu actual_len %lu\n", + x->extent.sector_length, hd->nr_sects ); + + /* this test assumes sector_start is zero, which in the new + IO world it always will be -- We need to simpligy the + grow/shrink interface as we'll always be deadling with whole + devices + */ + if ( x->extent.sector_length > hd->nr_sects ) + x->extent.sector_length = hd->nr_sects; + for ( px = &vbd->extents; *px != NULL; px = &(*px)->next ) continue; -- 2.30.2